package me.sealer.proxy;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author sealer
 * @date 2016/10/09
 * @email 1178884049@qq.com
 */
public class JdbcProxyTargetInvocationHandler implements InvocationHandler {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 目标对象
     */
    private Object target;

    /**
     * 构造方法
     *
     * @param target 目标对象
     */
    public JdbcProxyTargetInvocationHandler(Object target) {
        super();
        this.target = target;
    }

    /**
     * 执行目标对象的方法
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        // 在目标对象的方法执行之前简单的打印一下日志
        logger.debug("============before============");

        // 执行目标对象的方法
        Object result = method.invoke(target, args);

        // 在目标对象的方法执行之后简单的打印一下日志
        logger.debug("============after============");

        return result;
    }

    /**
     * 获取目标对象的代理对象
     *
     * @return 代理对象
     */
    public Object getProxy() {
        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                target.getClass().getInterfaces(), this);
    }
}
